// ==UserScript==
// @name         抖音上报
// @namespace    https://gitee.com/yc556/dy-oil-monkey-filter-video
// @version      2025-02-23
// @description  抖音上报时间几何
// @author       仰晨
// @match        *://*.douyin.com/*
// @icon         https://7.z.wiki/autoupload/20240504/t0lK.1006X1006-Snipaste_2024-05-04_21-14-39.png
// @grant        none
// @license      AGPL License
// ==/UserScript==

(function () {
  'use strict';

  /*
  * 提前配置上报信息
  * localStorage.setItem("recordingUrl",'https://xxx.cn/api/other/dySeeTime')
  * localStorage.setItem("recordingJwt",'xxx.xxx.xxx')
  * */
  const url = localStorage.getItem("recordingUrl");
  const jwtToken = localStorage.getItem("recordingJwt");

  const requestBody = {
    startTime: Math.floor(Date.now().valueOf() / 1000),  // 当前时间戳(毫秒转秒 除1000)
    endTime: undefined,
    thisTime: 0,
    totalDuration: 0,
    remark: "抖音其他页面",
  };
  const countTimer = setInterval(() => {
    if (document.visibilityState === 'visible') requestBody.thisTime++
  }, 1000)

  if (location.href === "https://www.douyin.com/" || location.href.startsWith("https://www.douyin.com/?"))
    requestBody.remark = "抖音刷视频";
  else if (location.href.startsWith("https://www.douyin.com/user"))
    requestBody.remark = "抖音用户页";
  else if (location.href.startsWith("https://www.douyin.com/search"))
    requestBody.remark = "抖音搜索页";

  /** 循环获取上报数据 */
  const requestTimer = setInterval(() => {
    if (document.visibilityState === 'visible') { // 浏览器可见时执行
      // 没有配置上报信息 跳出循环
      if (!requestBody.remark || !url || !jwtToken) {
        console.error('█████████数据上报脚本:没有配置上报信息,请先手动配置!██████████')
        clearInterval(requestTimer);
        clearInterval(countTimer);
        return;
      }
      requestBody.totalDuration = parseInt(localStorage.getItem("runTime"))  // 获取本地存储的运行时间⭐⭐偷懒来自另外一个脚本
      const currentTime = Math.floor(Date.now().valueOf() / 1000)
      // 上一次的最后上报时间戳和现在对比超过10分钟就改变开始时间戳为点前的时间戳，并且这次先不上报，等下次的10秒后再上报
      if (currentTime - requestBody.endTime > 600) {  // 单位：秒
        requestBody.startTime = currentTime;
        console.warn('███████在后台超过10分钟,按当前时间重新开始上报██████')
      } else {  // 改变最后上报时间，并开始上报
        requestBody.endTime = currentTime;
        if (requestBody?.totalDuration > 0) recording();
      }
    }
  }, 1000 * 10);

  /**
   * 提交上报数据
   *
   * @author Yc
   * @since 2024/8/30 23:14
   */
  const recording = () => {
    fetch(url, {
      method: 'POST',  // 指定请求方法为POST
      headers: {
        'Content-Type': 'application/json',             // 指定发送的数据类型为JSON
        'Authorization': `Bearer ${jwtToken}`           // 添加Authorization头部，带上JWT令牌
      },
      body: JSON.stringify(requestBody)
    })
      .then(response => response.json())      // 解析JSON格式的响应体
      .then(data => console.log(data))                  // 处理返回的数据
      .catch(error => console.error('Error:', error));  // 处理请求过程中发生的错误
  }

})();